//
// Created by dqchen on 2022/12/12.
//

#ifndef QUEST_0_1_SYMTAB_H
#define QUEST_0_1_SYMTAB_H

#include "meta.h"
#include "intermediate.h"
#include "iostream"

using namespace std::tr1;
using namespace std;


class Symtab {
    unordered_map<string, vector<Var *> *> var_map;    //变量集合
    unordered_map<string, Func *> func_map;  //函数集合
    vector<string> var_seq;     //变量序列
    vector<string> func_seq;    //函数序列
    vector<Var *> str_seq;      //字符常量集合
    vector<int> scope_seq;      //作用域序列
    Func *func;      //当前方法
    OrderGenerator *generator;
    vector<string> extern_seq;  //依赖其他程序的变量集合
    unordered_map<string, vector<Var *> *> global_var_map;    //全局变量集合

public:
    void addVar(Var *var);
    void addFunc(Func *func);
    vector<int>& getScope();
    Var* getVar(string name);
    vector<Var*> getStrs();
    Func* getFunc(string name);
    Func* getCurFunc();
    void incScope();
    void decScope();
    vector<string> getFuncSeq();
    void addStrSeq(Var *v);

    void addOrder(Order *order);    //添加中间代码指令
    void initGen(OrderGenerator *generator);
    void addExtern(string name);
    vector<string> getExternSeq();

    void addGlobalVar(Var *var);
    Var* getGlobalVar(string name);

    Symtab();
    ~Symtab();
};


#endif //QUEST_0_1_SYMTAB_H
